/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.saber.certificacao.ejbs.stateless.interfaces;

import br.com.saber.certificacao.modelos.Certificacao;
import br.com.saber.certificacao.modelos.Questao;
import br.com.saber.certificacao.modelos.Usuario;
import java.util.Set;
import javax.ejb.Local;

/**
 *
 * @author gbvbahia
 */
@Local
public interface CertificacaoBeanLocal {

    /**
     * Salva/Atualiza a certificação passada
     * @param certificacao
     */
    void salvarCertificacao(Certificacao certificacao);

    /**
     * Retorna a certificação que possui o nome passado.
     * @param nomeCertificacao
     * @return Certificação com mesmo nome ou null se não houver
     */
    Certificacao buscarCertificacaoPorNome(String nomeCertificacao);

    /**
     * Retorna todas as certificações cadastradas.
     * @return Um Set de certificações, sen não houver, será um Set vazio.
     */
    Set<Certificacao> buscarTodasCertificacoes();

    /**
     * Retorna a certificação que possui o ID passado.
     * @param id
     * @return Certificação com mesmo ID ou null se não houver
     */
    Certificacao buscarCertificascaoPorId(Long id);

    /**
     * Embora o método enfatiza professor, qualquer usuário pode ser
     * passado como parâmetro, Aluno, Professor, Coordenador.
     * Todas as certificações ligadas ao mesmo, atravéz de Versões
     * serão retornadas.
     * @param professor
     * @return Havendo uma ligação ProfessorVersao a certificação será retornada.
     */
    Set<Certificacao> buscarCertificacoesPorProfessor(Usuario professor);

    /**
     * Retorna todas as certificações que o coordenador é responsável.
     * Qualquer usuário pode ser passado, se ele não for coordenador ou se for mas
     * não tiver uma certificação como responsável será retornado cuma coleção set vazia.
     * @param coordenador
     * @return Um Set de certificações, um Set vazio se não houver.
     */
    Set<Certificacao> buscarCertificacoesPorCoordenador(Usuario coordenador);

    /**
     * Esse método deve sempre retornar uma certificação, caso isso não ocorra
     * é porque existe inconsistência no banco de dados
     * @param questao
     * @return A certificação da questão passada.
     */
    Certificacao buscarCertificacaoPorQuestao(Questao questao);

    /**
     * Retorna as certificações que possuem a no mínimo a quantidade de questões
     * passada como parêmetro.
     * @param quantidade minima de questões
     * @return Set com as certificações que possuem a quantidade mínima de questões
     */
    Set<Certificacao> buscarCertificacaoComQuantidadeQuestoes(int quantidade);

    /**
     * Usuario possui relacionamento LEAZY com Certificações.
     * CertificacoesProfessorAcesso, este método carrega
     * essas certificações e retorna para o solicitante.
     * @param professor
     * @return 
     */
    public Set<Certificacao> loadLazyCertificacoesDoProfessor(Usuario professor);
}
